package com.compression.tool.util;

import com.compression.tool.model.enums.TaskStatus;
import com.compression.tool.model.task.CompressionTask;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.logging.Logger;

/**
 * @author 自然醒
 * @version 1.0
 */
public class CompressionUtils {
    private static final Logger logger = Logger.getLogger(CompressionUtils.class.getName());

    /**
     * 等待任务恢复
     *
     * @param task
     * @throws InterruptedException
     */
    public static void waitForResume(CompressionTask task) throws InterruptedException {
        synchronized (task.getPauseLock()) {
            while (task.getStatus() == TaskStatus.PAUSED) {
                //每秒检查一次任务状态
                task.getPauseLock().wait(1000);
                logger.info("Task is paused. Waiting for resume...");
                if (task.isCancelled()) {
                    throw new InterruptedException("Task is cancelled.");
                }
            }
        }
    }


    /**
     * 通知任务完成
     *
     * @param task
     * @param success
     * @param message
     */
    public static void notifyCompletion(CompressionTask task, boolean success, String message) {
        task.complete(success, message);
    }


    /**
     * 计算压缩比
     * 压缩后大小与原始大小的比例
     * 越小表示压缩效果越好（压缩后文件越小）
     *
     * @param totalBytes
     * @param compressedSize
     * @return
     */
    public static double calculateCompressionRatio(long totalBytes, long compressedSize) {
        if (compressedSize == 0) {
            return 0;
        }
        return (double) compressedSize / totalBytes;
    }

    /**
     * 验证输出路径
     *
     * @param outputPath
     * @param sourceFiles
     * @return
     */
    public static boolean validateOutputPath(String outputPath, List<File> sourceFiles) {
        File outputFile = new File(outputPath);
        //输出路径存在
        if (outputFile.exists()) {
            //判断输出路径是否可写
            if (!outputFile.canWrite()) {
                return false;
            }
            //判断输出路径是否为文件
            if (outputFile.isFile()) {
                return false;
            }
        } else {
            //输出路径不存在 然后进行创建 判断是否创建成功
            if (!outputFile.mkdirs()) {
                return false;
            }
        }
        //检查源文件与输出路径的关系（避免将文件解压到自身）
        for (File sourceFile : sourceFiles) {
            try {
                if (sourceFile.getCanonicalPath().equals(outputFile.getCanonicalPath())) {
                    return false;
                }
                // 检查输出路径是否是源文件的子目录（避免循环）
                if (outputFile.getCanonicalPath().startsWith(sourceFile.getCanonicalPath() + File.separator)) {
                    return false;
                }
            } catch (IOException e) {
                logger.warning("无法获取规范路径: " + e.getMessage());
                throw new RuntimeException(e);
            }
        }
        return true;
    }
}
